package model

import (
	"errors"
	"gorm.io/gorm"
	"ppa/init/mysql"
)

type Nft struct {
	ID uint `json:"nft_id" form:"nft_id" gorm:"primaryKey;autoIncrement"`
	NftName string `json:"nft_name" form:"nft_name" gorm:"default:''"`
	NftImages string `json:"nft_images"  form:"nft_images" gorm:"default:''"`
	NftPrice float64 `json:"nft_price"  form:"nft_price" gorm:"default:0"`
	UserId uint `json:"user_id" form:"user_id" form:"default:0;index"`
	CollectionId uint `json:"collection_id" form:"collection_id" gorm:"default:1;index"`
	Royalty uint8 `json:"royalty" form:"royalty" gorm:"default:0"`
	OwnerUserId uint `json:"owner_user_id" form:"owner_user_id" gorm:"default:0;index"`
	TokenId uint `json:"token_id" form:"token_id" gorm:"default:0"`
	NftState uint8 `json:"nft_state" form:"nft_state" gorm:"default:0"`
	CreateTime uint `json:"create_time" gorm:"autoCreateTime"`
	LastTime uint `json:"last_time" gorm:"autoUpdateTime"`
	Collection Collection `json:"collection" gorm:"ForeignKey:CollectionId;AssociationForeignKey:CollectionId"`
	User User `json:"user" gorm:"ForeignKey:UserId;AssociationForeignKey:UserId"`
	OwnerUser User `json:"owner_user" gorm:"ForeignKey:OwnerUserId;AssociationForeignKey:UserId"`
	CategoriesNft []CategoriesNft `json:"categories_nft"  form:"categories_nft"  gorm:"ForeignKey:NftId"`
}

func (nft *Nft)GetNftInfo() (*Nft, error)  {
	var nftInfo *Nft
	err := mysql.SqlDB.Preload("Collection").Preload("User").Preload("CategoriesNft").Preload("CategoriesNft.Categories").Preload("OwnerUser").Where(nft).First(&nftInfo).Error
	if err != nil || errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, errors.New("未查询到数据存在")
	}
	return nftInfo, nil
}

func (nft *Nft)GetNftListByWhere() (*[]Nft, error)  {
	var nftInfo *[]Nft
	err := mysql.SqlDB.Preload("Collection").Preload("User").Preload("CategoriesNft").Preload("CategoriesNft.Categories").Preload("OwnerUser").Where(nft).Find(&nftInfo).Error
	if err != nil || errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, errors.New("未查询到数据存在")
	}
	return nftInfo, nil
}



func(nft *Nft)SetNftInfo(tx *gorm.DB) (*Nft, error)  {
	db := mysql.SqlDB
	if tx != nil {
		db = tx
	}
	err := db.Create(&nft).Error
	if err != nil {
		return nil, err
	}
	return nft, nil
}

func(nft *Nft)SetNftInfoByUserId() (*Nft, error)  {
	err := mysql.SqlDB.Model(&Nft{}).Where("owner_user_id = ? and id = ?", nft.OwnerUserId,nft.ID).Updates(map[string]interface{}{ "nft_price": nft.NftPrice,"nft_state": nft.NftState}).Error
	if err != nil {
		return nil, err
	}
	return nft, nil
}

func(nft *Nft)SetBuyNftInfo(tx *gorm.DB) (Nft, error)  {
	var nftInfo Nft
	db := mysql.SqlDB
	if tx != nil {
		db = tx
	}
	err := db.Model(&Nft{}).Where("id = ?",nft.ID).First(&nftInfo).Error
	if err != nil || errors.Is(err, gorm.ErrRecordNotFound) {
		return nftInfo, errors.New("未查询到数据存在")
	}
	err = db.Model(&Nft{}).Where("owner_user_id != ? and id = ?", nft.OwnerUserId,nft.ID).Updates(map[string]interface{}{"owner_user_id":nft.OwnerUserId,"nft_state": 0}).Error
	if err != nil {
		return nftInfo, err
	}

	return nftInfo, nil
}



func GetNftTopList(offset,limit int) (*[]Nft, error)  {
	nftIdList := GetNftTransientTop(offset,limit)
	var nftInfo *[]Nft
	err := mysql.SqlDB.Preload("Collection").Preload("User").Preload("CategoriesNft").Preload("CategoriesNft.Categories").Preload("OwnerUser").Where("id IN ?",nftIdList).Find(&nftInfo).Error
	if err != nil || errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, errors.New("未查询到数据存在")
	}
	return nftInfo, nil
}